/*
 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.spi.transport;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

import org.omg.CORBA.SystemException;

import com.sun.org.omg.SendingContext.CodeBase;

import com.sun.corba.se.pept.encoding.InputObject;
import com.sun.corba.se.pept.encoding.OutputObject;
import com.sun.corba.se.pept.protocol.MessageMediator;
import com.sun.corba.se.pept.transport.Connection;
import com.sun.corba.se.pept.transport.ResponseWaitingRoom;

import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.protocol.CorbaMessageMediator;

import com.sun.corba.se.impl.encoding.CodeSetComponentInfo;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;

/**
 * @author Harold Carr
 */
public interface CorbaConnection
    extends
    Connection,
    com.sun.corba.se.spi.legacy.connection.Connection {

  public boolean shouldUseDirectByteBuffers();

  public boolean shouldReadGiopHeaderOnly();

  public ByteBuffer read(int size, int offset, int length, long max_wait_time)
      throws IOException;

  public ByteBuffer read(ByteBuffer byteBuffer, int offset,
      int length, long max_wait_time) throws IOException;

  public void write(ByteBuffer byteBuffer)
      throws IOException;

  public void dprint(String msg);

  //
  // From iiop.Connection.java
  //

  public int getNextRequestId();

  public ORB getBroker();

  public CodeSetComponentInfo.CodeSetContext getCodeSetContext();

  public void setCodeSetContext(CodeSetComponentInfo.CodeSetContext csc);

  //
  // from iiop.IIOPConnection.java
  //

  // Facade to ResponseWaitingRoom.
  public MessageMediator clientRequestMapGet(int requestId);

  public void clientReply_1_1_Put(MessageMediator x);

  public MessageMediator clientReply_1_1_Get();

  public void clientReply_1_1_Remove();

  public void serverRequest_1_1_Put(MessageMediator x);

  public MessageMediator serverRequest_1_1_Get();

  public void serverRequest_1_1_Remove();

  public boolean isPostInitialContexts();

  // Can never be unset...
  public void setPostInitialContexts();

  public void purgeCalls(SystemException systemException,
      boolean die, boolean lockHeld);

  //
  // Connection status
  //
  public static final int OPENING = 1;
  public static final int ESTABLISHED = 2;
  public static final int CLOSE_SENT = 3;
  public static final int CLOSE_RECVD = 4;
  public static final int ABORT = 5;

  // Begin Code Base methods ---------------------------------------
  //
  // Set this connection's code base IOR.  The IOR comes from the
  // SendingContext.  This is an optional service context, but all
  // JavaSoft ORBs send it.
  //
  // The set and get methods don't need to be synchronized since the
  // first possible get would occur during reading a valuetype, and
  // that would be after the set.

  // Sets this connection's code base IOR.  This is done after
  // getting the IOR out of the SendingContext service context.
  // Our ORBs always send this, but it's optional in CORBA.

  void setCodeBaseIOR(IOR ior);

  IOR getCodeBaseIOR();

  // Get a CodeBase stub to use in unmarshaling.  The CachedCodeBase
  // won't connect to the remote codebase unless it's necessary.
  CodeBase getCodeBase();

  // End Code Base methods -----------------------------------------

  public void sendCloseConnection(GIOPVersion giopVersion)
      throws IOException;

  public void sendMessageError(GIOPVersion giopVersion)
      throws IOException;

  public void sendCancelRequest(GIOPVersion giopVersion, int requestId)
      throws
      IOException;

  public void sendCancelRequestWithLock(GIOPVersion giopVersion,
      int requestId)
      throws
      IOException;

  public ResponseWaitingRoom getResponseWaitingRoom();

  public void serverRequestMapPut(int requestId,
      CorbaMessageMediator messageMediator);

  public CorbaMessageMediator serverRequestMapGet(int requestId);

  public void serverRequestMapRemove(int requestId);

  // REVISIT: WRONG: should not expose sockets here.
  public SocketChannel getSocketChannel();

  // REVISIT - MessageMediator parameter?
  public void serverRequestProcessingBegins();

  public void serverRequestProcessingEnds();

  /**
   * Clean up all connection resources.  Used when shutting down an ORB.
   */
  public void closeConnectionResources();
}

// End of file.
